package com.handl.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapper;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
//开启路由网关功能，包含了@EnableDiscoveryClient注解，类似于@EnableEurekaClient
@EnableZuulProxy
//注册服务到注册中心，发现服务
//@EnableEurekaClient
public class ZuulApplication {

	/**
	 * 这个方式是zuul用来自定义服务于映射关系的功能
	 * 比如：服务可以有多个版本，假如命名为  servername-v1,servername-v2
	 * 那么zuul的默认路由映射规则则是/servername-v1/**，/servername-v2/**
	 * 这样的方式管理起来不方便，那么我们希望让他用/v1/servername/**这样的方式来映射和路由
	 *
	 * 这个方法创建的Bean就是来实现这个功能的
	 * 	参数1：检查请求路径的服务名称是否符合正则表达式，本例就是servername-v1这样方式
	 * 	参数2：如果检查通过，那么路由映射就变成参数2的正则方式/v1/servername/**
	 * 			如果检查不通过，那么还是以默认的方式进行路由/servername-v1/**
	 *
	 * 	这样做的好处是方便版本管理，统一版本间的调用
	 *
	 * @return
	 */
	@Bean
	public PatternServiceRouteMapper serviceRouteMapper(){
		return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)",
				"${verison}/${name}");
	}

	public static void main(String[] args) {
		SpringApplication.run(ZuulApplication.class, args);
	}
}
